import config from "@/server/config.js"
const envConfig = config[config.mode].baseURL;
const platform = uni.getSystemInfoSync().platform;

const whiteList = ['']; // 白名单列表
class request {
	constructor(header) {
		const token = uni.getStorageSync("userInfo").token;
		this._header = {};
		this._header["content-type"] = "application/json";
		this._header["platform"] = platform == "android" ? "android" : "ios";
		this._header["version"] = getApp().globalData.version || null; // 来源：/config/componentConfig.js中得到
		this._header["versionName"] = getApp().globalData.versionName || null; // 来源：/config/componentConfig.js中得到

		// const isInWhiteList = whiteList.some(item => item === ''); // 判断接口路径是否在白名单
		if (token) {
			this._header["Authorization"] = `Bearer ${token}`;
			// this._header["X-CSRFToken"] = token;
		}
		this._baseUrl = envConfig;
	}

	requestGet(url, data, hideLoading = true) {
		return new Promise((resolve, reject) => {
			uni.request({
				url: this._baseUrl + url,
				header: this._header,
				method: "GET",
				data: data,
				timeout: 1000 * 12,
				success: (res) => {
					// console.log("================="+url+"===============")
					// console.log(res.data)
					// console.log(`[${this._baseUrl + url}]success---`, "###data--", data, "###res--", res)
					if (res.statusCode === 200 && res.data && res.data.code === 200) {
						resolve(res.data);
					} else {
						reject(res);
					}
				},
				fail: (err) => {
					// console.log(`[${this._baseUrl + url}]fail---`, "###data--", data, "###res--", res)
					reject(err);
				},
				complete: (res) => {
					// console.log("================="+url+"===============")
					// if(url=='/support'){
					// 	console.log("================="+url+"===============")
					// 	console.log(res.data)
					// }
					hideLoading && uni.hideLoading();
					this.badRequest(res.statusCode, res);
				},
			})
		})
	}

	// 后端设计修改邮箱：先用老邮箱获取一个token，在调用修改邮箱接口时用这个token
	requestPost(url, data, hideLoading = true, token) {
		return new Promise((resolve, reject) => {

			if (token) {
				this._header["Authorization"] = `Bearer ${token}`;
			}

			uni.request({
				url: this._baseUrl + url,
				header: this._header,
				method: "POST",
				data: data,
				timeout: 1000 * 12,
				success: (res) => {
					// console.log(`[${this._baseUrl + url}]success---`, "###data--", data, "###res--", res)
					if (res.statusCode === 200 && res.data && res.data.code === 200) {
						resolve(res.data);
					} else {

						reject(res);
					}
				},
				fail: (err) => {
					// console.log(`[${this._baseUrl + url}]fail---`, "###data--", data, "###res--", res)
					reject(err);
				},
				complete: (res) => {
					hideLoading && uni.hideLoading();
					this.badRequest(res.statusCode, res);
				},
			});
		});
	}

	requestUpload(url, data, hideLoading = true) {
		return new Promise((resolve, reject) => {
			uni.uploadFile({
				url: this._baseUrl + url, //开发者服务器 url
				filePath: data, //要上传文件资源
				name: "avatar", //必须填file
				header: {
					...this._header,
					...{
						"content-type": "multipart/form-data;boundary=-",
					}
				},
				success: res => {
					if (res.statusCode === 200) {
						const datas = JSON.parse(res.data);
						if (datas.code == 200) {
							resolve(datas);
							uni.hideLoading();
							return
						}
						uni.hideLoading();
						uni.showToast({
							title: datas.message || "上传失败",
							icon: "none"
						})
						reject(res);
					} else {
						uni.hideLoading();
						uni.showToast({
							title: "服务错误，请稍后重试",
							icon: "none"
						})
						reject(res);
					}
				},
				fail: err => {
					console.log('上传 fail', err)
					uni.hideLoading();
					uni.showToast({
						title: "服务错误，请稍后重试",
						icon: "none"
					})
				},
			})
		});
	}

	badRequest(statusCode, res) {
		// HTTP状态码或者返回字段里的code, 这个跟HTTP状态码一致
		// 200 成功
		// 400 请求失败或者请求参数错误
		// 401 未登录或者登录失效, 执行登录操作
		// 403 token验证失败，无token
		// 404 资源或者路由未找到
		// 405 http请求方式不正确
		// 500 服务器内部错误, 非正式环境会在data里显示错误的trace信息, 方便你复制发给我排查问题, (可以直接展示错误信息)
		// 423 用户已注销，不存在
		// 409 用户被封禁
		// 接口文档返回结果有示例, 可能有多个, 正常只要查看成功示例
		// 但是例如短信接口，还有个非正式环境接口示例, 就是data里包含了验证码code，正式环境不会返回, 会按照成功示例来返回

		// 请求超时
		if (/timeout/.test(res.errMsg) || res.errMsg == "request:fail timeout") {
			uni.showToast({
				title: "请求超时，请稍后重试",
				icon: 'none',
				duration: 3000
			})
			return
		}

		switch (parseInt(statusCode)) {
			case 200:
				switch (res.data.code) {
					case 403:
						const { token } = uni.getStorageSync('userInfo');
						if(token){
							uni.clearStorageSync();
							getApp().globalData.userInfo = {};
							uni.showModal({
								content: "登录状态已过期，请重新登录",
								cancelText: "稍后",
								confirmText: "去登录",
								success: res => {
									if (res.confirm) {
										getApp().handleQuitLogin();
									}
								}
							})
						}
					default:
						if (res.data.code != 200) {
							uni.showToast({
								title: res.data.message,
								icon: "none",
								duration: 4000
							})
						}
						break;
				}
				break;
			default:
				// uni.showModal({
				// 	showCancel: false,
				// 	content: res.data.message || "服务错误，请稍后重试",
				// });
				break;
		}

		// if (code === 400) {
		// 	uni.showToast({
		// 		title: res.data.message || "请求失败或者请求参数错误",
		// 		icon: 'none'
		// 	})
		// 	return
		// }
		// if (code === 401) {
		// 	uni.showModal({
		// 		showCancel: false,
		// 		content: res.data.message || "未登录或者登录失效, 请重新登录",
		// 		success: res => {
		// 			if (res.confirm) {
		// 				this.handleClearLogin()
		// 				uni.reLaunch({
		// 					url: "/pages/login/login"
		// 				})
		// 			}
		// 		}
		// 	});
		// 	return
		// }
		// if (code === 403) {
		// 	uni.showModal({
		// 		title: res.data.message,
		// 		showCancel: false,
		// 	})
		// 	return
		// }
		// if (code === 404) {
		// 	uni.showModal({
		// 		showCancel: false,
		// 		content: res.data.message || "资源或者路由未找到",
		// 	});
		// 	return
		// }
		// if (code === 405) {
		// 	uni.showModal({
		// 		showCancel: false,
		// 		content: res.data.message || "http请求方式不正确",
		// 	});
		// 	return
		// }
		// if (code === 409) {
		// 	uni.showModal({
		// 		title: res.data.message,
		// 		showCancel: false,
		// 		confirmText: "知道了",
		// 		success: res => {
		// 			if (res.confirm) {
		// 				this.handleClearLogin()
		// 				uni.reLaunch({
		// 					url: "/pages/login/login"
		// 				})
		// 			}
		// 		}
		// 	})
		// 	return
		// }
	}

	handleClearLogin() {
		uni.clearStorageSync();
		getApp().globalData.userInfo = {};
	}
}
export default request;